import {PrismaClient} from '@prisma/client';

import { Revenue } from '@/app/lib/definitions';

const prisma = new PrismaClient();

export async function fetchRevenue() {
    try {
        const data = await prisma.revenue.findMany();

        // 排序函数：按月份排序
        const sortByMonth = (data: Revenue[]): Revenue[] => {
            return [...data].sort((a, b) => {
            // 提取月份数字
            const getMonthNumber = (str: string): number => {
                const match = str.match(/\d+/);
                return match ? parseInt(match[0], 10) : 0;
            };
        
            return getMonthNumber(a.month) - getMonthNumber(b.month);
            });
        };
        const sortData = sortByMonth(data);

        return sortData;
    } catch (err) {
        console.error('SQLite Error: ', err);
        throw new Error('Failed to fetch revenue data.');
    }
}

export async function fetchLatestInvoices() {
    try {
        // 获取最新的5个发票记录及其关联的客户信息
        const latestInvoices = await prisma.invoice.findMany({
          include: {
            customer: true, // Prisma将自动处理JOIN操作
          },
          orderBy: {
            date: 'desc', // 按日期降序排列
          },
          take: 5, // 限制结果为5条
        });
    
        // 将查询结果映射为所需的字段
        const result = latestInvoices.map(invoice => ({
          amount: invoice.amount.toString(),
          name: invoice.customer.name,
          image_url: invoice.customer.image_url,
          email: invoice.customer.email,
          id: invoice.id,
        }));
    
        return result;
      } catch (error) {
        // 打印错误信息
        console.error('Error fetching data:', error);
        throw error; // 可以选择重新抛出错误，或者在这里处理它
      } finally {
        // 无论成功还是失败，最终都会执行
        await prisma.$disconnect(); // 断开数据库连接
      }
}

export async function fetchCardData() {
    try {
        const voiceCountPromsi =prisma.invoice.count();
        const customerCountPromise = prisma.customer.count();

        // 方法一：直接使用SQL语句查询，以下代码也能正确返回
        // 使用Prisma的raw查询来执行类似SQL中CASE WHEN的逻辑
        // const result = await prisma.$queryRaw`
        //     SELECT
        //         SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS "paid",
        //         SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END) AS "pending"
        //     FROM "invoices"
        // `;
        // return {
        //     numberOfCustomers,
        //     numberOfInvoices,
        //     totalPaidInvoices: result[0].paid,
        //     totalPendingInvoices:result[0].pending,
        // };

        // 方法二：更好的方案。使用 Prisma 的 aggregate 方法来对 Invoice 模型进行聚合操作。
        // 把要查询内容作为返回值paidTotal的属性
        const paidTotalPromis = prisma.invoice.aggregate({
            _sum: { // 使用 _sum 聚合函数计算这些记录的 amount 字段总和
                amount: true
            },
            where: {
                status: 'paid' // 设置 where 条件筛选出状态为 paid 的发票记录
            }
        });
    
        const pendingTotalPromis = prisma.invoice.aggregate({
            _sum: {
                amount: true
            },
            where: {
                status: 'pending'
            }
        });

        // 并行获取数据
        const data = await Promise.all([
            voiceCountPromsi,
            customerCountPromise,
            paidTotalPromis,
            pendingTotalPromis,
        ]);

        return {
            numberOfCustomers: data[0].valueOf() || 0,
            numberOfInvoices: data[1].valueOf() || 0,
            totalPaidInvoices: data[2]._sum.amount || 0,
            totalPendingInvoices: data[3]._sum.amount || 0,
        };

    } catch (error) {
        // 打印错误信息
        console.error('Error fetching data:', error);
        throw error; // 可以选择重新抛出错误，或者在这里处理它
    } finally {
        // 无论成功还是失败，最终都会执行
        await prisma.$disconnect(); // 断开数据库连接
    }
}
